package cn.e4j.modular.api.service;

import cn.e4j.core.dto.Dtos;
import cn.e4j.core.dto.impl.Dto;
import cn.e4j.core.util.ToolUtil;
import cn.e4j.modular.api.mapper.Gwat510Mapper;
import cn.e4j.modular.api.util.CommonUtils;
import cn.e4j.modular.crm.entity.*;
import cn.e4j.modular.system.entity.SysUser;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;


@Service
public class Gwat510Service {

    @Autowired
    Gwat510Mapper gwat510Mapper;

    /**
     * 获取订单运输列表
     *
     * @param inDto
     * @return
     */
    public List<Dto> getGwcuData(Page<Object> page, Dto inDto) {
        return gwat510Mapper.getGwcuPage(page, inDto);
    }

    /**
     * 判断是否可以取消确认
     *
     * @param inDto
     * @return
     */
    public List<Dto> getGwcw(Dto inDto) {
        return gwat510Mapper.getGwcw(inDto);
    }

    /**
     * 获取产品配件表信息
     *
     * @param inDto
     * @return
     */
    public List<Dto> getGwax(Dto inDto) {
        return gwat510Mapper.getGwax(inDto);
    }


    /**
     * 获取客户已购设备表
     *
     * @param inDto
     * @return
     */
    public List<Dto> getMmra(Dto inDto) {
        return gwat510Mapper.getMmra(inDto);
    }


    /**
     * 获取产品配件表信息
     *
     * @param inDto
     * @return
     */
    public Dto getGwcs(Dto inDto) {
        return gwat510Mapper.getGwcs(inDto);
    }

    public String check(Dto inDto){
        QueryWrapper<GwamlT> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("GWAMLENT", inDto.getString("ENT")).eq("GWAML001", inDto.getString("GWCU001"));
        GwamlT gwamlT = new GwamlT().selectOne(queryWrapper);

        if(ToolUtil.isEmpty(gwamlT)){
            return String.format("未抓到该产品信息[%s]",inDto.getString("GWCU001"));
        }

        Dto queryDto = Dtos.newDto();
        queryDto.put("GWAXENT", inDto.getString("ENT"));
        queryDto.put("GWAX001", inDto.getString("GWCU001"));

        if(this.getGwax(queryDto).size() <=0){
            return String.format("该产品无配件信息[%s]",inDto.getString("GWCU001"));
        }

        return null;
    }

    public void insert(MmraT mmra_tPO, List<MmrbT> mmrb_tPOS) {
        mmra_tPO.insert();
        for (MmrbT mmrb_tPO : mmrb_tPOS) {
            mmrb_tPO.insert();
        }
    }

    public void update(MmraT mmra_tPO, List<MmrbT> mmrb_tPOS) {
        UpdateWrapper<MmraT> mmraTUpdateWrapper = new UpdateWrapper<>();
        mmraTUpdateWrapper.eq("MMRAENT", mmra_tPO.getMMRAENT());
        mmraTUpdateWrapper.eq("MMRA001", mmra_tPO.getMMRA001());
        mmraTUpdateWrapper.eq("MMRA002", mmra_tPO.getMMRA002());
        mmraTUpdateWrapper.eq("MMRA003", mmra_tPO.getMMRA003());

        mmra_tPO.update(mmraTUpdateWrapper);
        for (MmrbT mmrb_tPO : mmrb_tPOS) {
            //WHERE  mmrbent = #{mmrbent} AND mmrb001 = #{mmrb001} AND mmrb002 = #{mmrb002} AND mmrb003 = #{mmrb003} AND mmrb004 = #{mmrb004} AND mmrb005 = #{mmrb005}
            UpdateWrapper<MmrbT> mmrbTUpdateWrapper = new UpdateWrapper<>();
            mmrbTUpdateWrapper.eq("MMRBENT", mmrb_tPO.getMMRBENT());
            mmrbTUpdateWrapper.eq("MMRB001", mmrb_tPO.getMMRB001());
            mmrbTUpdateWrapper.eq("MMRB002", mmrb_tPO.getMMRB002());
            mmrbTUpdateWrapper.eq("MMRB003", mmrb_tPO.getMMRB003());
            mmrb_tPO.update(mmrbTUpdateWrapper);
        }
    }


    @Transactional
    public void updateDataYSingle(Dto inDto, SysUser sysUser) {
        updateDataY(inDto, sysUser);
    }

    @Transactional
    public void updateDataYBatch(List<Dto> dtoList, SysUser sysUser) {
        for(Dto inDto : dtoList){
            updateDataY(inDto, sysUser);
        }
    }

    private void updateDataY(Dto item, SysUser sysUser) {
        item.put("GWCUENT", item.getString("ENT"));
        GwcuT gwcuT = CommonUtils.toJavaClass(item, GwcuT.class);
        gwcuT.setGWCUACTI("Y");
        UpdateWrapper<GwcuT> gwcuTUpdateWrapper = new UpdateWrapper<>();
        gwcuTUpdateWrapper.eq("GWCUENT", gwcuT.getGWCUENT());
        gwcuTUpdateWrapper.eq("GWCUDOCNO", gwcuT.getGWCUDOCNO());
        gwcuTUpdateWrapper.eq("GWCUSEQ", gwcuT.getGWCUSEQ());
        gwcuT.update(gwcuTUpdateWrapper);

        MmraT mmra_tPO = new MmraT();
        Dto pDto = Dtos.newDto();
        pDto.put("GWCSENT", item.getString("ENT"));
        pDto.put("GWCSDOCNO", item.getString("GWCU030"));
        pDto.put("GWCSSEQ", item.getBigDecimal("GWCU031"));
        Dto tDto = this.getGwcs(pDto);

        String MMRA001= (tDto==null?"":tDto.getString("GWCS010"));
        pDto.put("MMRAENT", item.getString("ENT"));
        pDto.put("MMRA001", MMRA001);
        pDto.put("MMRA002", item.getString("GWCU001"));
        pDto.put("MMRA003", item.getString("GWCU002"));
        List<Dto> tList = this.getMmra(pDto);

        mmra_tPO.setMMRAENT(sysUser.getDBC());
        mmra_tPO.setMMRA001(MMRA001);
        mmra_tPO.setMMRA002(item.getString("GWCU001"));
        mmra_tPO.setMMRA003(item.getString("GWCU002"));

        QueryWrapper<GwamlT> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("GWAMLENT", item.getString("ENT")).eq("GWAML001", item.getString("GWCU001"));
        GwamlT gwamlT = new GwamlT().selectOne(queryWrapper);

        mmra_tPO.setMMRA004(gwamlT.getGWAML003());
        mmra_tPO.setMMRA005(gwamlT.getGWAML004());
        mmra_tPO.setMMRA007(" ");
        mmra_tPO.setMMRA009(" ");
        mmra_tPO.setMMRA010(LocalDate.now());
        mmra_tPO.setMMRA013("0");
        mmra_tPO.setMMRA014("1");
        mmra_tPO.setMMRAACTI("Y");

        GwaaT GwaaTPO = new GwaaT();
        QueryWrapper<GwaaT> queryWrapper1 = new QueryWrapper<>();
        queryWrapper1.eq("GWAAENT", item.getString("ENT")).eq("GWAA001", sysUser.getACCOUNT());
        GwaaT gwaaT = GwaaTPO.selectOne(queryWrapper1);

        mmra_tPO.setMMRA020(gwaaT.getGWAA009());

        List<MmrbT> mmrb_tPOS = new ArrayList<>();
        Dto queryDto = Dtos.newDto();
        queryDto.put("GWAXENT", item.getString("ENT"));
        queryDto.put("GWAX001", item.getString("GWCU001"));
        List<Dto> list = this.getGwax(queryDto);
        if (list.size() > 0) {
            for (int j = 0; j < list.size(); j++) {
                MmrbT mmrb_tPO = new MmrbT();
                mmrb_tPO.setMMRBENT(sysUser.getDBC());
                mmrb_tPO.setMMRB001(MMRA001);
                mmrb_tPO.setMMRB002(item.getString("GWCU001"));
                mmrb_tPO.setMMRB003(item.getString("GWCU002"));

                GwamlT GwamlTPO = new GwamlT();
                QueryWrapper<GwamlT> query = new QueryWrapper<>();
                queryWrapper1.eq("GWAMLENT", item.getString("ENT")).eq("GWAML001", list.get(j).getString("GWAX003"));
                GwamlT gwaml_tPO_ = GwamlTPO.selectOne(query);

                mmrb_tPO.setMMRB004(list.get(j).getString("GWAX003"));
                mmrb_tPO.setMMRB005(" ");
                mmrb_tPO.setMMRB006(gwaml_tPO_.getGWAML003());
                mmrb_tPO.setMMRB007(gwaml_tPO_.getGWAML004());
                mmrb_tPO.setMMRB015(new BigDecimal("1").doubleValue());
                mmrb_tPO.setMMRB016(" ");
                mmrb_tPO.setMMRB017(" ");
                mmrb_tPO.setMMRB024(BigDecimal.ZERO.doubleValue());
                mmrb_tPO.setMMRBACTI("Y");
                mmrb_tPOS.add(mmrb_tPO);
            }
        }
        if (tList.size() > 0) {
            this.update(mmra_tPO, mmrb_tPOS);
        } else {
            this.insert(mmra_tPO, mmrb_tPOS);
        }
    }

    @Transactional
    public void updateDataNSingle(Dto inDto) {
        updateDataN(inDto);
    }

    @Transactional
    public void updateDataNBatch(List<Dto> dtoList, Dto inDto) {
        for(Dto item : dtoList){
            item.put("ENT", inDto.getString("ENT"));
            updateDataN(item);
        }
    }

    private void updateDataN(Dto item) {
        item.put("GWCUENT", item.getString("ENT"));
        GwcuT gwcuT = CommonUtils.toJavaClass(item, GwcuT.class);
        gwcuT.setGWCUACTI("N");
        UpdateWrapper<GwcuT> gwcuTUpdateWrapper = new UpdateWrapper<>();
        gwcuTUpdateWrapper.eq("GWCUENT", gwcuT.getGWCUENT());
        gwcuTUpdateWrapper.eq("GWCUDOCNO", gwcuT.getGWCUDOCNO());
        gwcuTUpdateWrapper.eq("GWCUSEQ", gwcuT.getGWCUSEQ());
        gwcuT.update(gwcuTUpdateWrapper);
        Dto pDto = new Dto();
        pDto.put("GWCSENT", item.getString("ENT"));
        pDto.put("GWCSDOCNO", item.getString("GWCU030"));
        pDto.put("GWCSSEQ", item.getBigDecimal("GWCU031"));
        Dto tDto = this.getGwcs(pDto);
        pDto.put("MMRAENT", item.getString("ENT"));
        pDto.put("MMRA001", tDto.getString("GWCS010"));
        pDto.put("MMRA002", item.getString("GWCU001"));
        pDto.put("MMRA003", item.getString("GWCU002"));
        MmraT mmraT = CommonUtils.toJavaClass(pDto, MmraT.class);
        mmraT.setMMRAACTI("X");
        UpdateWrapper<MmraT> mmraTUpdateWrapper = new UpdateWrapper<>();
        mmraTUpdateWrapper.eq("MMRAENT", mmraT.getMMRAENT());
        mmraTUpdateWrapper.eq("MMRA001", mmraT.getMMRA001());
        mmraTUpdateWrapper.eq("MMRA002", mmraT.getMMRA002());
        mmraT.update(mmraTUpdateWrapper);
        Dto queryDto = Dtos.newDto();
        queryDto.put("GWAXENT", item.getString("ENT"));
        queryDto.put("GWAX001", item.getString("GWCU001"));
        List<Dto> list = this.getGwax(queryDto);
        if (list.size() > 0) {
            for (int j = 0; j < list.size(); j++) {
                Dto mmrbDto = Dtos.newDto();
                mmrbDto.put("MMRBENT", item.getString("ENT"));
                mmrbDto.put("MMRB001", tDto.getString("GWCS010"));
                mmrbDto.put("MMRB002", item.getString("GWCU001"));
                mmrbDto.put("MMRB003", item.getString("GWCU002"));
                mmrbDto.put("MMRB004", list.get(j).getString("GWAX003"));
                MmrbT mmrbT = JSONObject.parseObject(JSON.toJSONString(pDto)).toJavaObject(MmrbT.class);
                mmrbT.setMMRBACTI("X");
                UpdateWrapper<MmrbT> mmrbTUpdateWrapper = new UpdateWrapper<>();
                mmrbTUpdateWrapper.eq("MMRBENT", mmrbT.getMMRBENT());
                mmrbTUpdateWrapper.eq("MMRB001", mmrbT.getMMRB001());
                mmrbTUpdateWrapper.eq("MMRB002", mmrbT.getMMRB002());
                mmrbTUpdateWrapper.eq("MMRB003", mmrbT.getMMRB003());
                mmrbTUpdateWrapper.eq("MMRB004", mmrbT.getMMRB004());
                mmrbTUpdateWrapper.eq("MMRB005", mmrbT.getMMRB005());
                mmrbT.update(mmrbTUpdateWrapper);
            }
        }
    }

    /**
     * 获取经销商负责人,线人
     *
     * @param inDto
     * @return
     */
//    public List<Dto> getGwaa(Dto inDto) {
//        inDto.put("GWAAENT", "80");
//        return gwat510Mapper.getGwaa(inDto);
//    }

    /**
     * 根据单号+项次，获取正式订单中的线人数据
     *
     * @param inDto
     * @return
     * @author wenchuan.li 201806131620
     */
    public Dto getGwcsXR(Dto inDto) {
        return gwat510Mapper.getGwcsXR(inDto);
    }

}
